/*
 * @Author: ljk
 * @Date: 2023-05-17 20:34:04
 * @LastEditors: ljk
 * @LastEditTime: 2023-05-18 21:09:04
 * @Description: 硬件中断
 */
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>

using namespace std;

// SIGFPE:产生硬件中断导致OS内核溢出标志位被置0,导致OS一直往进程发送8号信号催促退出
// SIGSEGV:MMU硬件中断导致OS一直发11信号给该进程令其终止(MMU,寄存器是集成在CPU里面的)
void handler(int signo)
{
    std::cout << "已收到" << signo << "号信号导致崩溃" << std::endl;
    exit(1);
}

void showBlock(sigset_t *oset)
{
    int signo = 1;
    for (; signo <= 31; signo++)
    {
        if (sigismember(oset, signo))
        {
            cout << "1";
        }
        else
        {
            cout << "0";
        }
    }
    cout << endl;
}
int main()
{
    //OS定义的数据类型
    sigset_t set, oset;
    sigemptyset(&set);
    sigemptyset(&oset);

    sigaddset(&set, 2); //SIGINT

    sigprocmask(SIG_SETMASK, &set, &oset); //1. 2号信号没有反应 2.我们看到老的信号屏蔽字block位图是全0

    int cnt = 1;
    while (true)
    {
        showBlock(&oset);
        sleep(1);
        cnt++;

        if (cnt == 10)
        {
            cout << "recover block" << endl;
            sigprocmask(SIG_SETMASK, &oset, &set);
            showBlock(&set);
        }
    }

    //设置进入

    // #define SIG_ERR ((__sighandler_t)-1) /* Error return.  */
    // #define SIG_DFL ((__sighandler_t)0)  /* Default action.  */
    // #define SIG_IGN ((__sighandler_t)1)  /* Ignore signal.  */

    // 默认处理动作(不写也是默认)
    // signal(2, SIG_DFL);

    // // 忽略该信号
    // signal(3, SIG_IGN);

    // pid_t id = fork();
    // if (id == 0)
    // {
    //     cout << "野指针问题...here" << endl;
    //     cout << "野指针问题...here" << endl;
    //     cout << "野指针问题...here" << endl;
    //     cout << "野指针问题...here" << endl;

    //     int* p = nullptr;
    //     *p = 100;

    //     cout << "野指针问题...here" << endl;
    //     cout << "野指针问题...here" << endl;
    //     cout << "野指针问题...here" << endl;
    //     cout << "野指针问题...here" << endl;
    //     exit(1);
    // }
    // int status = 0;
    // waitpid(id, &status, 0);
    // cout << "exit code: " << ((status>>8) & 0xFF) << endl;
    // cout << "exit signal: " << ((status) & 0x7F) << endl;
    // cout << "core dump flag: " << ((status>>7) & 0x1) << endl;

    // while (true)
    // {
    //     cout << "我是一个正常进程, 正在模拟某种异常: " << getpid() << endl;
    //     sleep(1);
    // }

    // signal(SIGSEGV, handler);

    // int* p = nullptr;
    // //p = (int*)100; // 1
    // std::cout << "野指针问题..." << std::endl;
    // std::cout << "野指针问题..." << std::endl;
    // std::cout << "野指针问题..." << std::endl;
    // *p = 100; // 2

    // cout << "野指针问题 ... here" << endl;

    // signal(SIGFPE, handler);
    // int a = 10;
    // a /= 0;

    // cout << "div zero ... here" << endl;

    return 0;
}